/**
 * student.js
 * 数据操作文件模块
 * 职责：操作文件的数据，只处理数据，不关心业务
 */
   var fs=require('fs')
   var dbPath='./db.json'  //路径文件不用require()
 /**
  * 获取所有学生列表
  * callback 中的参数
  *      第一个参数是err
  *         成功是null
  *         错误是 错误对象
  *      第二个参数是 结果
  *         成功是 数组
  *         错误是 undefined
  * return[]
  */
 exports.find=function(callback){
    fs.readFile(dbPath,'utf8',function(err,data){
        if(err){
            return callback(err)
        }
        //console.log(JSON.parse(data).students)
        callback(null,JSON.parse(data).students)  // JSON.parse() 用于将一个 JSON字符串转换为对象
       
    })
 }

  /**
   * 根据Id获取学生对象
   * @param {Number}id   学生 id
   * @param {function} callback 回调函数
   * 
   *  EcmaScript 6 中的一个数组方法：find
   *  需要接收一个函数作为参数
   *  当某个遍历项符合 item.id(遍历项的id) === student.id(被传输过来的id) 条件的时候，find 会终止遍历，同时返回遍历项
   */
  exports.findById=function(id,callback){
    fs.readFile(dbPath,'utf8',function(err,data){
        if(err){
            return callback(err)
        }
        var students=JSON.parse(data).students

        var ret=students.find(function(item){
            return item.id===parseInt(id)
        })
        callback(null,ret)
    })
}

  /**
   * 添加保存学生
   */
  exports.save=function(student,callback){
     fs.readFile(dbPath,function(err,data){
       if(err){
           return callback(err)
       }
       //将字符串数据转换为对象数据
       var students=JSON.parse(data).students

       //处理id 唯一的，不重复    将传入的新学生信息定义一个id(继下去的)
       student.id=students[students.length-1].id+1

       students.push(student)
       
       //用文件db.json 的形式转换还原
       var fileData=JSON.stringify(
           {
           students:students
           }
       )

       //将数据写入db.json 文件中
       fs.writeFile(dbPath,fileData,function(err){
           if(err){
               //错误就把错误对象传递给它
               return callback(err)
           }
           //成功就没错，所以错误对象就是unll
           callback(null)
       })
     })
  }

   /**
    * 更新学生
    */
   exports.updateById=function(student,callback){
    console.log('updateById 的'+student.id)
       fs.readFile(dbPath,'utf8',function(err,data){
           if(err){
               return callback(err)
            }
          var students=JSON.parse(data).students

 //**注意：这里统一将id 统一转换为数字类型
          student.id=parseInt(student.id)
         

          //你要修改谁，就需要把谁找出来
          //EcmaScript 6 中的一个数组方法：find
          //需要接收一个函数作为参数
          //当某个遍历项符合item.id===students.id 条件的时候，find会终止遍历。同时返回遍历项
          var stud=students.find(function(item){
                return item.id===student.id
                })
          
          //将传入的数据逐个赋值给stud
          for(var key in student){
              stud[key]=student[key]
          }
          
          
          //再将数据写入db.json 文件中
           //用文件db.json 的形式（字符串）转换还原
        var fileData=JSON.stringify(
          {
               students:students
          }
          )

         //将数据写入db.json 文件中
           fs.writeFile(dbPath,fileData,function(err){
              if(err){
                  //错误就把错误对象传递给它
                  return callback(err)
               }
                  //成功就没错，所以错误对象就是unll
                callback(null)
           })

       })
   }

    /**
     * 删除学生
     */
    exports.deleteById=function(id,callback){
        fs.readFile(dbPath,'utf8',function(err,data){
            if(err){
                return callback(err) 
            }
            var students=JSON.parse(data).students
            
            //获取id
            //dindIndex  根据元素获取下标
            var deleteId=students.findIndex(function(item){
                return item.id===parseInt(id)
            })
 
            //students=students.splice(deleteId,1)
            students.splice(deleteId,1)

               //用文件db.json 的形式（字符串）转换还原
            var fileData=JSON.stringify(
                 {
                    students:students
                 }
               )
  
           //将数据写入db.json 文件中
             fs.writeFile(dbPath,fileData,function(err){
                if(err){
                    //错误就把错误对象传递给它
                    return callback(err)
                 }
                    //成功就没错，所以错误对象就是unll
                  callback(null)
             })
        })
    }